package pe.gob.osinergmin.activity;

import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;

import org.apache.http.Header;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import pe.gob.osinergmin.R;
import pe.gob.osinergmin.activity.dialog.PlacaDialog;
import pe.gob.osinergmin.activity.generic.GenericActionBarActivity;
import pe.gob.osinergmin.activity.module.GPSActivity;
import pe.gob.osinergmin.activity.module.ScopActivity;
import pe.gob.osinergmin.activity.module.SeguridadActivity;
import pe.gob.osinergmin.bean.common.GuiaFiscalizacionDetalle;
import pe.gob.osinergmin.bean.common.Producto;
import pe.gob.osinergmin.bean.common.Usuario;
import pe.gob.osinergmin.component.MenuListAdapter;
import pe.gob.osinergmin.component.MenuListItem;
import pe.gob.osinergmin.utils.PuntoControlConstants;
import pe.gob.osinergmin.utils.PuntoControlUtils;

import java.text.MessageFormat;
import java.util.List;
import java.util.ArrayList;

import static pe.gob.osinergmin.utils.PuntoControlConstants.SESSION_USER_VAR;

public class MenuActivity extends GenericActionBarActivity {

    private List<MenuListItem> menuOptions = new ArrayList<>();

    private MenuActivity menuActivity = null;

    private Usuario usuario;

    private PlacaDialog dialog;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menu);
        setToolbar((Toolbar) findViewById(R.id.menu_toolbar));
        setSupportActionBar(getToolbar());
    }



    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        menuActivity = this;
        /* MenuListItem(Long code, String img, String title, String description) */
        menuOptions.add(new MenuListItem(ScopActivity.code,R.drawable.menu_scop, getResources().getString(R.string.menu_opcion_scop_title), getResources().getString(R.string.menu_opcion_scop_descripcion)));
        menuOptions.add(new MenuListItem(SeguridadActivity.code,R.drawable.menu_seguridad, getResources().getString(R.string.menu_opcion_seguridad_title), getResources().getString(R.string.menu_opcion_seguridad_descripcion)));
        menuOptions.add(new MenuListItem(GPSActivity.code,R.drawable.menu_gps, getResources().getString(R.string.menu_opcion_gps_title), getResources().getString(R.string.menu_opcion_gps_descripcion)));

        Resources resources = getResources();

        ListView listView = (ListView) findViewById(R.id.menu_options_list);

        MenuListAdapter menuListAdapter = new MenuListAdapter( menuActivity, menuOptions, resources);
        listView.setAdapter(menuListAdapter);

        usuario = (Usuario)getIntent().getExtras().getSerializable(SESSION_USER_VAR);

        writeStatusBar();

        // Se obtiene la lista de productos
        List<Producto> productoList;
        try {
            productoList = getProductoService().getProductoList(this);
        } catch (Exception e) {
            productoList = null;
            showToast(getBaseContext(), R.string.error_load_producto_local, Toast.LENGTH_SHORT);
        }
        if(productoList == null){
            getProductListFromServer(this);
        }

        // PuntoControlUtils.deleteExternalFile(this,GuiaFiscalizacionDetalle.class.getSimpleName());
        // PuntoControlUtils.deleteExternalFile(this,Producto.class.getSimpleName());

        dialog = new PlacaDialog(menuActivity);
        dialog.setMenuActivity(menuActivity);
    }

    public void onItemClick(int mPosition){
        MenuListItem itemSelected = menuOptions.get(mPosition);
        int codeSelected = itemSelected.getCode();
        boolean hasConnection = PuntoControlUtils.validateConnectivity(this);
        if(codeSelected == ScopActivity.code){
            Intent intent = new Intent(getBaseContext(), ScopActivity.class);
            intent.putExtra(SESSION_USER_VAR, usuario);
            if(PuntoControlConstants.unidadOperativa != null && (PuntoControlConstants.EMPTY.equals(PuntoControlConstants.unidadOperativa.getPlaca()) || PuntoControlConstants.unidadOperativa.getPlaca() == null)){
                dialog.setIntent(intent);
                dialog.show();
            }else {
                startActivity(intent);
            }
        }else{
            if(codeSelected == SeguridadActivity.code){
                try {
                    PuntoControlUtils.getProgressDialog(this, getResources().getString(R.string.waiting_find_guia)).show();
                    List<GuiaFiscalizacionDetalle> guiaFiscalizacionDetalleList = getGuiaFiscalizacionDetalleService().getGuiaFiscalizacionDetalleList(this);
                    PuntoControlUtils.getProgressDialog().dismiss();
                    if(guiaFiscalizacionDetalleList == null){
                        if(hasConnection) {
                            getGuiaFiscalizacionDetalleListFromServer(menuActivity);
                        }else {
                            showSeguridadActivity();
                        }
                    }else{
                        Intent intent = new Intent(getBaseContext(), SeguridadActivity.class);
                        intent.putExtra(SESSION_USER_VAR, usuario);
                        if(PuntoControlConstants.unidadOperativa != null && (PuntoControlConstants.EMPTY.equals(PuntoControlConstants.unidadOperativa.getPlaca()) || PuntoControlConstants.unidadOperativa.getPlaca() == null)){
                            dialog.setIntent(intent);
                            dialog.show();
                        }else {
                            startActivity(intent);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }else{
                if(codeSelected == GPSActivity.code){
                    if(PuntoControlUtils.validateConnectivity(this)) {
                        Intent intent = new Intent(getBaseContext(), GPSActivity.class);
                        intent.putExtra(SESSION_USER_VAR, usuario);
                        startActivity(intent);
                    }else{
                        showToast(this, R.string.error_gps_option_dont_have_internet, Toast.LENGTH_SHORT);
                    }
                }
            }
        }
    }

    @Override
    public void onClick(View v) {
        // Method "onClick" doesn't useful in this Activity
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu items for use in the action bar
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Intent intent;
        switch (item.getItemId()) {
            case R.id.action_settings:
                intent = new Intent(menuActivity, ConfigActivity.class);
                intent.putExtra(SESSION_USER_VAR, usuario);
                startActivityForResult(intent, 0);
                /*
                ConfigDialog configDialog = new ConfigDialog(menuActivity);
                configDialog.show();*/
                return true;
            case R.id.logout:
                PuntoControlUtils.deleteExternalFile(this, Usuario.class.getSimpleName());
                intent = new Intent(menuActivity, LoginActivity.class);
                startActivity(intent);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case 0:
                writeStatusBar();
                break;
            default:
                break;
        }
    }

    private void getProductListFromServer(final Context context){
        if(PuntoControlUtils.getProgressDialog().isShowing()){
            PuntoControlUtils.getProgressDialog().dismiss();
        }
        PuntoControlUtils.getProgressDialog(context, getResources().getString(R.string.waiting_load_producto)).show();

        AsyncHttpClient client = new AsyncHttpClient();
        String url = PuntoControlConstants.URL_PRODUCTO_GET;
        client.get(url,null ,new AsyncHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                try {
                    List<Producto> result = new ArrayList<>();
                    // JSON Object
                    JSONArray list = new JSONArray(new String(responseBody));
                    for(int i = 0; i < list.length(); i++){
                        JSONObject obj = list.getJSONObject(i);
                        Producto producto = new Producto();
                        producto.setCodigo(obj.getInt("codigo"));
                        producto.setDescripcion(obj.getString("descripcion"));
                        producto.setDescripcionCorta(obj.getString("descripcionCorta"));
                        result.add(producto);
                    }
                    // Se almacena la información en un archivo plano
                    getProductoService().saveProductoListToLocal(context, result);
                    PuntoControlUtils.getProgressDialog().dismiss();
                } catch (JSONException e) {
                    PuntoControlUtils.getProgressDialog().dismiss();
                    showToast(context, R.string.error_json_generic, Toast.LENGTH_LONG);
                } catch (Exception e) {
                    PuntoControlUtils.getProgressDialog().dismiss();
                    showToast(context, e.getMessage(), Toast.LENGTH_LONG);
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                PuntoControlUtils.getProgressDialog().dismiss();
                if(statusCode == 404){
                    showToast(context, R.string.error_http_404, Toast.LENGTH_LONG);
                }
                // When Http response code is '500'
                else if(statusCode == 500){
                    showToast(context, R.string.error_http_500, Toast.LENGTH_LONG);
                }
                // When Http response code other than 404, 500
                else{
                    showToast(context, R.string.error_http_other, Toast.LENGTH_LONG);
                }
            }
        });
    }

    private void getGuiaFiscalizacionDetalleListFromServer(final Context context){
        if(PuntoControlUtils.getProgressDialog().isShowing()){
            PuntoControlUtils.getProgressDialog().dismiss();
        }
        PuntoControlUtils.getProgressDialog(context, getResources().getString(R.string.waiting_load_guia)).show();

        AsyncHttpClient client = new AsyncHttpClient();
        String url = PuntoControlConstants.URL_GUIASUPERVISION_SEGURIDAD_GET;
        client.get(url, null, new AsyncHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                try {
                    List<GuiaFiscalizacionDetalle> result = new ArrayList<>();
                    // JSON Object
                    JSONArray list = new JSONArray(new String(responseBody));
                    for(int i = 0; i < list.length(); i++){
                        JSONObject obj = list.getJSONObject(i);
                        GuiaFiscalizacionDetalle guiaFiscalizacionDetalle = new GuiaFiscalizacionDetalle();
                        guiaFiscalizacionDetalle.setCodigo(obj.getInt("codigo"));
                        guiaFiscalizacionDetalle.setCodigoObservacion(obj.getString("codigoObservacion"));
                        guiaFiscalizacionDetalle.setCodigoGuia(obj.getInt("guia"));
                        guiaFiscalizacionDetalle.setDescripcion(obj.getString("descripcion"));
                        guiaFiscalizacionDetalle.setBaseLegal(obj.getString("baseLegal"));
                        result.add(guiaFiscalizacionDetalle);
                    }
                    // Se almacena la información en un archivo plano
                    getGuiaFiscalizacionDetalleService().saveGuiaFiscalizacionDetalleListToLocal(context, result);
                    PuntoControlUtils.getProgressDialog().dismiss();
                    showSeguridadActivity();
                } catch (JSONException e) {
                    PuntoControlUtils.getProgressDialog().dismiss();
                    showToast(context, R.string.error_json_generic, Toast.LENGTH_LONG);
                } catch (Exception e) {
                    PuntoControlUtils.getProgressDialog().dismiss();
                    showToast(context, e.getMessage(), Toast.LENGTH_LONG);
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                PuntoControlUtils.getProgressDialog().dismiss();
                if(statusCode == 404){
                    showToast(context, R.string.error_http_404, Toast.LENGTH_LONG);
                }
                // When Http response code is '500'
                else if(statusCode == 500){
                    showToast(context, R.string.error_http_500, Toast.LENGTH_LONG);
                }
                // When Http response code other than 404, 500
                else{
                    showToast(context, R.string.error_http_other, Toast.LENGTH_LONG);
                }
            }
        });
    }

    private void showSeguridadActivity() {
        launchActivity(SeguridadActivity.class);
    }

    private void launchActivity(Class activity){
        if(PuntoControlUtils.getProgressDialog().isShowing()){
            PuntoControlUtils.getProgressDialog().dismiss();
        }
        PuntoControlUtils.getProgressDialog(menuActivity, getResources().getString(R.string.waiting_load_default)).show();
        Intent intent = new Intent(getBaseContext(), activity);
        intent.putExtra(SESSION_USER_VAR, usuario);
        if(PuntoControlConstants.unidadOperativa != null & (PuntoControlConstants.EMPTY.equals(PuntoControlConstants.unidadOperativa.getPlaca()) || PuntoControlConstants.unidadOperativa.getPlaca() == null)){
            dialog.setIntent(intent);
            dialog.show();
        }else {
            startActivity(intent);
        }
    }

    private void writeStatusBar(){
        // Colocando la bienvenida
        TableLayout tableLayout = (TableLayout) findViewById(R.id.status_bar);
        TextView nombre = (TextView) tableLayout.findViewById(R.id.status_bar_nombre);
        String txtNombre = MessageFormat.format(getResources().getString(R.string.menu_welcome), usuario.getNombreCompleto());
        nombre.setText(txtNombre);

        TextView placa = (TextView)tableLayout.findViewById(R.id.status_bar_placa);
        if(PuntoControlConstants.unidadOperativa != null && (!PuntoControlConstants.EMPTY.equals(PuntoControlConstants.unidadOperativa.getPlaca()) && PuntoControlConstants.unidadOperativa.getPlaca() != null)){
            String txtPlaca = MessageFormat.format(getResources().getString(R.string.menu_placa), PuntoControlConstants.unidadOperativa.getPlaca());
            placa.setText(txtPlaca);
        }else{
            placa.setText(PuntoControlConstants.EMPTY);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        writeStatusBar();
    }
}
